安卓开发学习之HelloDaemon源码阅读 您所在的位置:网站首页 dismissable 和disposable 安卓开发学习之HelloDaemon源码阅读

安卓开发学习之HelloDaemon源码阅读

2023-09-19 13:40| 来源: 网络整理| 查看: 265

背景

最近单位项目里要用到双服务进程保活,目的是要保证服务不被杀死。

双进程保活实际是两个进程相互监听,在各自的销毁回调方法里,启动对方。网上有一个不错的双服务进程保活开源框架,叫做HelloDaemon,github地址:

https://github.com/xingda920813/HelloDaemon 现在,记录一下对于其的源码阅读过程

源码阅读 AbsWorkService

我们的工作(服务)进程要继承于AbsWorkService,启动时要调用onBind()和onStartCommand()方法

    @Override     public int onStartCommand(Intent intent, int flags, int startId) {         return onStart(intent, flags, startId);     }       @Nullable     @Override     public IBinder onBind(Intent intent) {         onStart(intent, 0, 0);         return onBind(intent, null);     }

其中onBind()里的onBind(intent, null)是留给子类实现的,用于bind时的业务逻辑。因此关键就是onStart()方法

onStart()     /**      * 1.防止重复启动,可以任意调用 DaemonEnv.startServiceMayBind(Class serviceClass);      * 2.利用漏洞启动前台服务而不显示通知;      * 3.在子线程中运行定时任务,处理了运行前检查和销毁时保存的问题;      * 4.启动守护服务;      * 5.守护 Service 组件的启用状态, 使其不被 MAT 等工具禁用.      */     protected int onStart(Intent intent, int flags, int startId) {           //启动守护服务,运行在:watch子进程中         DaemonEnv.startServiceMayBind(WatchDogService.class);           //业务逻辑: 实际使用时,根据需求,将这里更改为自定义的条件,判定服务应当启动还是停止 (任务是否需要运行)         Boolean shouldStopService = shouldStopService(intent, flags, startId);         if (shouldStopService != null) {             if (shouldStopService) stopService(intent, flags, startId); else startService(intent, flags, startId);         }           if (mFirstStarted) {             mFirstStarted = false;             //启动前台服务而不显示通知的漏洞已在 API Level 25 修复,大快人心!             if (Build.VERSION.SDK_INT = Build.VERSION_CODES.JELLY_BEAN_MR2)                     DaemonEnv.startServiceSafely(new Intent(getApplication(), WorkNotificationService.class));             }             getPackageManager().setComponentEnabledSetting(new ComponentName(getPackageName(), WatchDogService.class.getName()),                     PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);         }           return START_STICKY;     }

可分四步:

1、启动看门狗

2、停止或启动自身

3、初次调用时,启动前台服务并不显示通知

4、设置看门狗所在应用不被杀死

首先启动了一个WatchDogService,也就是看门狗服务,它就是用来每隔一段时间启动工作进程的。至于为何说DaemonEnv.startServiceMayBind()方法可以任意调用而不怕服务重复启动(实则时不怕服务重复绑定),可以点进去看看源码的实现

DaemonEnv#startServiceMayBind() public static void startServiceMayBind(@NonNull final Class


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有